/**
 * 
 */
package it.unisalento.appsalento.asynctask;

import it.unisalento.R;
import it.unisalento.appsalento.activity.dialog.GenericDialog;
import it.unisalento.appsalento.asynctask.framework.AndroidServiceIteratorProvider;
import it.unisalento.appsalento.constants.Constants;

import java.io.IOException;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.view.MenuItem;
import android.view.View;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.sun.jersey.spi.service.ServiceFinder;

/**
 * <p>
 * <b>Description</b>: Classe abstract che  definisce la struttura degli Async Task da utlizzare
 * per il recupero dei dati dal WS.
 * </p>
 * @author Alberto Gianfranco Meleleo
 * 
 */
public abstract class SyncAsyncTask extends AsyncTask<Void, Void, Void> {

	protected ProgressDialog progress;
	protected Context context;
	protected View rootView;
	protected MenuItem refreshMenuItem;
	protected final Gson gson = new GsonBuilder().create();
	
	
	public SyncAsyncTask() {
	}
	
	
	@SuppressWarnings("rawtypes")
	public SyncAsyncTask(Context context, MenuItem refreshMenuItem) {
		ServiceFinder.setIteratorProvider(new AndroidServiceIteratorProvider());
		this.context = context;
		this.refreshMenuItem = refreshMenuItem;
	}

	@Override
	protected void onPreExecute() {
		if (refreshMenuItem != null) {
			refreshMenuItem.setActionView(R.layout.action_progressbar);

			refreshMenuItem.expandActionView();
		}

	}

	@Override
	protected Void doInBackground(Void... params) {
	try{	
		ObjectMapper mapper = new ObjectMapper();
		setData(mapper);
	} catch (Throwable e) {
		e.printStackTrace();
		new GenericDialog(context, "",Constants.TITLE_ERROR);
	} 

		return null;
	}

	/**
	  * Metodo che si occupa di effettuare la chiamata ai WS.
	 * @param mapper ObjectMapper necessario per la conversione del json restituito in oggetto java.
	 * @return 
	 * <li>true : se la chiamata ai ws �� andata a buon fine</li>
	 * <li>false : se la chiamata ai ws ha restituito un errore o se il parametro status del json di risposta ��
	 * impostato a KO</li>
	 */
	public abstract boolean setData(ObjectMapper mapper)  throws JsonParseException, JsonMappingException, IOException  ;
}
